package app

import (
	"fmt"
	"os"
	"path/filepath"

	"github.com/jmoiron/sqlx"
)

// 全局使用数据库连接
var DB *sqlx.DB

// 初始化数据库
// 返回值:
// *sqlx.DB: 数据库连接
// error: 错误信息
func InitDB(homePath string) (*sqlx.DB, error) {
	// 构造数据库文件路径
	dbPath := filepath.Join(homePath, QuickBackupDBFile)

	// 错误存储变量
	var err error

	// 检查数据库文件是否存在, 如果不存在, 则创建并初始化
	if _, err := os.Stat(dbPath); os.IsNotExist(err) {
		// 连接数据库
		DB, err = sqlx.Connect("sqlite3", dbPath)
		if err != nil {
			return nil, fmt.Errorf("连接数据库失败: %w", err)
		}

		// 执行初始化SQL语句
		if _, err := DB.Exec(InitSql); err != nil {
			return nil, fmt.Errorf("执行初始化SQL语句失败: %w", err)
		}

		// 直接返回连接
		return DB, nil
	} else if err != nil {
		return nil, fmt.Errorf("连接到数据库文件失败: %w", err)
	}

	// 存在数据库文件, 直接连接
	DB, err = sqlx.Connect("sqlite3", dbPath)
	if err != nil {
		return nil, fmt.Errorf("连接数据库失败: %w", err)
	}

	return DB, nil
}

// 初始化数据目录
// 返回值:
// error: 错误信息
func InitDataDir() (string, error) {
	// 获取用户主目录
	homeDir, err := os.UserHomeDir()
	if err != nil {
		return "", fmt.Errorf("获取用户主目录失败: %w", err)
	}

	// 构造数据目录路径
	dataDir := filepath.Join(homeDir, QuickBackupHomeDir, QuickBackupDataDir)

	// 检查数据目录是否存在, 如果不存在, 则创建
	if _, err := os.Stat(dataDir); os.IsNotExist(err) {
		if err := os.MkdirAll(dataDir, 0755); err != nil {
			return "", fmt.Errorf("创建数据目录失败: %w", err)
		}
	} else if err != nil {
		return "", fmt.Errorf("检查数据目录失败: %w", err)
	}

	return filepath.Join(homeDir, QuickBackupHomeDir), nil
}
